16 research outputs found

    Hybrid Differential Software Testing

    Get PDF
    Differentielles Testen ist ein wichtiger Bestandteil der Qualitätssicherung von Software, mit dem Ziel Testeingaben zu generieren, die Unterschiede im Verhalten der Software deutlich machen. Solche Unterschiede können zwischen zwei Ausführungspfaden (1) in unterschiedlichen Programmversionen, aber auch (2) im selben Programm auftreten. In dem ersten Fall werden unterschiedliche Programmversionen mit der gleichen Eingabe untersucht, während bei dem zweiten Fall das gleiche Programm mit unterschiedlichen Eingaben analysiert wird. Die Regressionsanalyse, die Side-Channel Analyse, das Maximieren der Ausführungskosten eines Programms und die Robustheitsanalyse von Neuralen Netzwerken sind typische Beispiele für differentielle Softwareanalysen. Eine besondere Herausforderung liegt in der effizienten Analyse von mehreren Programmpfaden (auch über mehrere Programmvarianten hinweg). Die existierenden Ansätze sind dabei meist nicht (spezifisch) dafür konstruiert, unterschiedliches Verhalten präzise hervorzurufen oder sind auf einen Teil des Suchraums limitiert. Diese Arbeit führt das Konzept des hybriden differentiellen Software Testens (HyDiff) ein: eine hybride Analysetechnik für die Generierung von Eingaben zur Erkennung von semantischen Unterschieden in Software. HyDiff besteht aus zwei parallel laufenden Komponenten: (1) einem such-basierten Ansatz, der effizient Eingaben generiert und (2) einer systematischen Analyse, die auch komplexes Programmverhalten erreichen kann. Die such-basierte Komponente verwendet Fuzzing geleitet durch differentielle Heuristiken. Die systematische Analyse basiert auf Dynamic Symbolic Execution, das konkrete Eingaben bei der Analyse integrieren kann. HyDiff wird anhand mehrerer Experimente evaluiert, die in spezifischen Anwendungen im Bereich des differentiellen Testens ausgeführt werden. Die Resultate zeigen eine effektive Generierung von Testeingaben durch HyDiff, wobei es sich signifikant besser als die einzelnen Komponenten verhält.Differential software testing is important for software quality assurance as it aims to automatically generate test inputs that reveal behavioral differences in software. The concrete analysis procedure depends on the targeted result: differential testing can reveal divergences between two execution paths (1) of different program versions or (2) within the same program. The first analysis type would execute different program versions with the same input, while the second type would execute the same program with different inputs. Therefore, detecting regression bugs in software evolution, analyzing side-channels in programs, maximizing the execution cost of a program over multiple executions, and evaluating the robustness of neural networks are instances of differential software analysis with the goal to generate diverging executions of program paths. The key challenge of differential software testing is to simultaneously reason about multiple program paths, often across program variants, in an efficient way. Existing work in differential testing is often not (specifically) directed to reveal a different behavior or is limited to a subset of the search space. This PhD thesis proposes the concept of Hybrid Differential Software Testing (HyDiff) as a hybrid analysis technique to generate difference revealing inputs. HyDiff consists of two components that operate in a parallel setup: (1) a search-based technique that inexpensively generates inputs and (2) a systematic exploration technique to also exercise deeper program behaviors. HyDiff’s search-based component uses differential fuzzing directed by differential heuristics. HyDiff’s systematic exploration component is based on differential dynamic symbolic execution that allows to incorporate concrete inputs in its analysis. HyDiff is evaluated experimentally with applications specific for differential testing. The results show that HyDiff is effective in all considered categories and outperforms its components in isolation

    Model counting of string constraints for probabilistic symbolic execution

    Get PDF
    Probabilistic symbolic execution is a static analysis technique aiming at quantifying the probability of a target event occurring during a program execution; it exploits symbolic execution to identify the conditions on the program inputs leading to the occurrence of the target event and then model counting to quantify their probability. While efficient methods exist for model counting of numeric constraints, only limited results have been obtained for counting string constraints. The constraints are indeed first encoded in a corresponding accepting automaton; then the number of accepting paths of the automaton is quantified via a convenient generating function. The encoding in the form of automata limits the expressiveness of the formalism used for constraint specification to constructs mappable into automata, for an exact model count. Furthermore, the encoding of disjunctions requires the parallel composition of the automata representing the disjuncts, leading to an exponential growth in the size of the resulting automata. This thesis introduces the usage of SMT solvers to count the models of a string constraint by leveraging a standard smtlib interface. Several algorithms for both exact and approximate model counting of string constraints are defined and compared. The different solutions are implemented on top of the SMT solver CVC4 and evaluated on a set of established benchmarks, demonstrating the increased expressiveness with respect to previous approaches and improved performance on several classes of problems.Probabilistic Symbolic Execution ist eine statische Analysetechnik, um die Eintrittswahrscheinlichkeit eines Ereignisses in der Programmausführung zu bestimmen. Es verwendet dazu eine Kombination der herkömmlichen Symbolic Execution und dem Zählen von Modellen. Symbolic Execution extrahiert die Pfadbedingungen, die notwendig sind, um zu dem Ereignis zu gelangen. Indem man die Anzahl Möglichkeiten berechnet, diese Bedingungen zu erfüllen, kann die Eintrittswahrscheinlichkeit des Ereignisses bestimmt werden. Während für das Zählen von Modellen für numerische Bedingungen schon effiziente Methoden publiziert wurden, existieren für das Zählen von Bedingungen mit Zeichenketten zurzeit nur eingeschränkte Möglichkeiten. Die existierenden Techniken basieren auf der Konstruktion von endlichen Zustandsautomaten, deren Sprache die erfüllenden Zeichenketten akzeptieren. Die Anzahl Modelle ergibt sich durch die Bestimmung der Anzahl akzeptierender Pfade in diesen Automaten. Diese Reduktion des Problems schränkt die Teilmenge an formulierbaren Bedingungen ein, für welche die exakte Anzahl Modelle bestimmt werden kann. Des Weiteren führen komplexe Bedingungen mit Verkettung von Disjunktionen zu einer Zustandsexplosion im konstruierten Automaten. Diese Thesis stellt ein Verfahren vor, das mit Hilfe von sogenannten SMT Solvern, die Anzahl Modelle von Bedingungen mit Zeichenketten bestimmen kann. Es wurden mehrere Algorithmen entwickelt, die unter Verwendung einer standardisierten SMT Solver Schnittstelle die exakten also auch approximativen Mengen an Modellen berechnen können. Als Implementierungsgrundlage wurde der SMT Solver CVC4 verwendet. Die Evaluation des entwickelten Forschungsprototyps mit etablierten Benchmarktests zeigt die erweiterte Ausdrucksfähigkeit der SMT-basierenden Verfahren gegenüber den existierenden Ansätzen. Außerdem können bestimmte Problemklassen nun effizienter gelöst werden

    Grafische Benutzeroberfläche zur Analyse von Abhängigkeitsgraphen

    Get PDF
    In dieser Bachelorarbeit wurde in Kooperation mit der itestra GmbH eine Eclipse Plug-in zur Visualisierung von Abhängigkeitsgraphen entworfen und implementiert. Als Basis diente das von der itestra GmbH selbst entwickelte Analysewerkzeug, das Abhängigkeiten in Softwaresystemen analysiert. Die Software wurde mit der Vorgehensweise der evolutionären Software-Entwicklung entwickelt, wobei jede Evolutionsstufe durch eine Evaluation mit den Mitarbeitern der itestra GmbH abgeschlossen wurde. Aus der Entwicklung resultierten insgesamt drei Eclipse Plug-ins: DependencyVisualizer, DependencyLayoutAlgorithms und DependencyModelAdapter. Das Plug-in DependencyVisualizer sorgt für die eigentliche Visualisierung des Abhängigkeitsgraphen und nutzt dabei die Layout-Algorithmen aus dem Plug-in DependencyLayoutAlgorithms. Das Plug-in DependencyModelAdapter stellt die Anbindung an das bestehende Analysewerkzeug der itestra GmbH bereit. Das Werkzeug DependencyVisualizer wird in Zukunft von den Mitarbeitern der itestra GmbH eingesetzt

    Intelligent Tutoring System: Experience of Linking Software Engineering and Programming Teaching

    Full text link
    The increasing number of computer science students pushes lecturers and tutors of first-year programming courses to their limits to provide high-quality feedback to the students. Existing systems that handle automated grading primarily focus on the automation of test case executions in the context of programming assignments. However, they cannot provide customized feedback about the students' errors, and hence, cannot replace the help of tutors. While recent research works in the area of automated grading and feedback generation address this issue by using automated repair techniques, so far, to the best of our knowledge, there has been no real-world deployment of such techniques. Based on the research advances in recent years, we have built an intelligent tutoring system that has the capability of providing automated feedback and grading. Furthermore, we designed a Software Engineering course that guides third-year undergraduate students in incrementally developing such a system over the coming years. Each year, students will make contributions that improve the current implementation, while at the same time, we can deploy the current system for usage by first year students. This paper describes our teaching concept, the intelligent tutoring system architecture, and our experience with the stakeholders. This software engineering project for the students has the key advantage that the users of the system are available in-house (i.e., students, tutors, and lecturers from the first-year programming courses). This helps organize requirements engineering sessions and builds awareness about their contribution to a "to be deployed" software project. In this multi-year teaching effort, we have incrementally built a tutoring system that can be used in first-year programming courses. Further, it represents a platform that can integrate the latest research results in APR for education

    NEUROSPF: A tool for the Symbolic Analysis of Neural Networks

    Full text link
    This paper presents NEUROSPF, a tool for the symbolic analysis of neural networks. Given a trained neural network model, the tool extracts the architecture and model parameters and translates them into a Java representation that is amenable for analysis using the Symbolic PathFinder symbolic execution tool. Notably, NEUROSPF encodes specialized peer classes for parsing the model's parameters, thereby enabling efficient analysis. With NEUROSPF the user has the flexibility to specify either the inputs or the network internal parameters as symbolic, promoting the application of program analysis and testing approaches from software engineering to the field of machine learning. For instance, NEUROSPF can be used for coverage-based testing and test generation, finding adversarial examples and also constraint-based repair of neural networks, thus improving the reliability of neural networks and of the applications that use them. Video URL: https://youtu.be/seal8fG78L

    Trust Enhancement Issues in Program Repair

    No full text
    ICSE '22: Proceedings of the 44th International Conference on Software Engineerin
    corecore